Тетрис.отд
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                        ОТДЕЛ Тетрис+; 
(******************************************************************************)
(* НАЗНАЧЕНИЕ: игра "Тетрис"                                                  *)
(* ОБОЗНАЧЕНИЯ:                                                               *)
(*   уровень - скоростной уровень игры (0-самый медленный, 9-самый быстрый)   *)
(*   слой    - заполненных и провалившихся слоёв                              *)
(*   кирпич  - падающая фигура                                                *)
(*   ящик    - то место, в котором падают кирпичи                             *)
(*   клетки  - квадратики, из которых построенны кирпичи                      *)
(* ПРИМЕЧАНИЯ: для управления можно использовать клавиатуру и мышку,          *)
(*           продолжение см. в отделе \Глагол\Приложения\Игры\Тетрис\Игра.отд *)
(******************************************************************************)
ИСПОЛЬЗУЕТ 
  Игра     ИЗ ".\Тетрис\",
  Ввод     ИЗ "...\Отделы\Обмен\",
  Вывод    ИЗ "...\Отделы\Обмен\",
  Окно     ИЗ "...\Отделы\Обмен\",
  Поле     ИЗ "...\Отделы\Поле\",
  Надел    ИЗ "...\Отделы\Поле\",
  Подложка ИЗ "...\Отделы\Поле\",
  Записка  ИЗ "...\Отделы\Поле\",
  Черта    ИЗ "...\Отделы\Поле\",
  Кнопка   ИЗ "...\Отделы\Поле\",
  Матем    ИЗ "...\Отделы\Числа\",
  ОС       ИЗ "...\Отделы\Обмен\"; 

ПОСТ
  уровней       =10; 
  слоёвНаУровень=10;  (* для перевода на следующий уровень *)

               (* действия *)
  дПредУровень =1; 
  дСледУровень =2; 
  дЗаново      =3; 
  дВыход       =4; 
  дПриостановка=5; 

ПЕР
  уровень:ЦЕЛ; 
  задержка:ЦЕЛ;    (* между сменой кадров *)
  будетСлоёв:ЦЕЛ;  (* для перевода на следующий уровень *)
  зСлоёв,зУровень:Записка.Доступ; 
  играем:КЛЮЧ; 

(******************************************************************************)
ЗАДАЧА Случ(до:ЦЕЛ):ЦЕЛ; 
(* Цель:  выдать случайное число *)
УКАЗ
  ВОЗВРАТ УЗК(ВШИРЦЕЛ(Матем.случ()*до))
КОН Случ; 

(******************************************************************************)
ЗАДАЧА рисоватьКлетку(x,y,цвет:ЦЕЛ); 
(* прорисовка на экране клетки ящика, 
 * передаётся в распоряжение отделу Ящик *)
ПЕР
  к,с:ЦЕЛ;  (* экранные координаты клетки *)
УКАЗ
  с:=1+y*1; 
  к:=1+x*2;  (* расширим клетку на 2 колонки *)
  Окно.Цвет(с,к,с,к+1,ВЗНАК(цвет)); 
  ЕСЛИ цвет = Игра.Пустоцвет ТО
    Окно.Цепь(с,к,с,к+1," .")
  ИНАЧЕ
    Окно.Цепь(с,к,с,к+1,"  ")
  КОН
КОН рисоватьКлетку; 

(******************************************************************************)
ЗАДАЧА НачатьЗаново; 
(* подготовка к новой игре *)
УКАЗ
  уровень:=0; 
  задержка:=0; 
  будетСлоёв:=слоёвНаУровень; 
  играем:=ВКЛ; 
  Игра.НачатьЗаново
КОН НачатьЗаново; 

(******************************************************************************)
ЗАДАЧА Показания; 
(* обновляет показания на экране *)
УКАЗ
  Записка.ИзЧЦел(зСлоёв,"Слоёв: %d",Игра.слоёв,0,0,0); 
  Записка.ИзЧЦел(зУровень,"%d",уровень,0,0,0)
КОН Показания; 

(******************************************************************************)
ЗАДАЧА ПредУровень; 
УКАЗ
  ЕСЛИ уровень > 0 ТО 
    УМЕНЬШИТЬ(уровень); 
    Показания
  КОН
КОН ПредУровень; 

(******************************************************************************)
ЗАДАЧА СледУровень; 
УКАЗ
  ЕСЛИ уровень < уровней-1 ТО 
    УВЕЛИЧИТЬ(уровень);  
    Показания
  КОН
КОН СледУровень; 

(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ;  посылка+:Ввод.Посылка); 
(* получить и обработать управляющие послания *)
ПЕР
  код:ЦЕЛ; 
УКАЗ
  ДЛЯ посылка ВИДА
  | Ввод.ОтКлавиш:
      код:=посылка.код; 
      посылка.код:=0;  (* скорее всего отработаем посылку *)
      ВЫБРАТЬ код ИЗ
      | 25H: ЕСЛИ играем ТО Игра.КирпичВлево     КОН (* Стрелки *)
      | 26H: ЕСЛИ играем ТО Игра.ПовернутьКирпич КОН
      | 27H: ЕСЛИ играем ТО Игра.КирпичВправо    КОН
      | 28H: ЕСЛИ играем ТО Игра.КирпичУронить   КОН
      | 1BH: поле.состояние:=дВыход  (* Esc *)
      | 58H: ЕСЛИ посылка.упрАльт ТО  (* Alt+'X' *)
               поле.состояние:=дВыход
             ИНАЧЕ
               посылка.код:=код
             КОН
      ИНАЧЕ
        посылка.код:=код
      КОН
  | Кнопка.Посылка:
      ВЫБРАТЬ посылка.кнопка.действие ИЗ
      | дЗаново:       НачатьЗаново
      | дПредУровень:  ПредУровень
      | дСледУровень:  СледУровень
      | дВыход:        поле.состояние:=дВыход
      | дПриостановка: играем:=НЕ играем
      КОН
  ИНАЧЕ
  КОН
КОН Приём; 

(******************************************************************************)
ЗАДАЧА СоздатьПоле():Поле.Доступ; 
(* создаёт рабочее поле экрана *)
ПЕР
  зСловоУровень:Записка.Доступ;                  (* слово "Уровень"     *)
  чЧерта1,чЧерта2,чЧерта3,чЧерта4:Черта.Доступ;  (* чёрточки            *)
  кнВыход,кнЗаново,кнМеньше,
  кнБольше,кнПриостановить:Кнопка.Доступ;        (* экранные кнопки     *)
  поле:Поле.Доступ;                              (* рабочее поле экрана *)
  подложка:Подложка.Доступ;                      (* подложка поля       *)
УКАЗ
  (* создаём поле *)
  поле:=Поле.Создать(0,0,25,46,ПУСТО,ОТКЛ,Приём); 
  (* создаём наделы *)
  подложка:=Подложка.Создать(0,0,0,0,""); 
  зСловоУровень:=Записка.Создать(20,30,1,7,"Уровень");  
  зСлоёв  :=Записка.Создать( 6,22,1,11,"");  
  зУровень:=Записка.Создать(21,33,1, 2,"");  
  (* создаём чёрточки *)
  чЧерта1:=Черта.Создать( 0,21,0,1);  
  чЧерта2:=Черта.Создать(19,21,1,0);  
  чЧерта3:=Черта.Создать(22,21,1,0);  
  чЧерта4:=Черта.Создать(17,21,1,0);  
  (* создаём кнопки *)
  кнМеньше:=Кнопка.Создать(21,22,"[ ~Меньше ]",дПредУровень,ВКЛ);  
  кнБольше:=Кнопка.Создать(21,35,"[ ~Больше ]",дСледУровень,ВКЛ);  
  кнЗаново:=Кнопка.Создать(23,22,"[ ~Заново ]",дЗаново,ВКЛ);  
  кнВыход :=Кнопка.Создать(23,35,"[ ~Выход  ]",дВыход,ВКЛ);  
  кнПриостановить:=Кнопка.Создать(18,25,"[ ~Приостановка ]",дПриостановка,ВКЛ);  
  (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(поле,подложка); 
  Поле.ДобавитьНадел(поле,зСлоёв); 
  Поле.ДобавитьНадел(поле,зСловоУровень); 
  Поле.ДобавитьНадел(поле,зУровень); 
  Поле.ДобавитьНадел(поле,чЧерта1); 
  Поле.ДобавитьНадел(поле,чЧерта4); 
  Поле.ДобавитьНадел(поле,чЧерта3); 
  Поле.ДобавитьНадел(поле,чЧерта2); 

  Поле.ДобавитьНадел(поле,кнПриостановить); 
  Поле.ДобавитьНадел(поле,кнМеньше); 
  Поле.ДобавитьНадел(поле,кнБольше); 
  Поле.ДобавитьНадел(поле,кнЗаново); 
  Поле.ДобавитьНадел(поле,кнВыход); 
  ВОЗВРАТ поле
КОН СоздатьПоле; 

(******************************************************************************)
ЗАДАЧА Пауза(мс:ЦЕЛ); 
УКАЗ
  Окно.Отработать; 
  ОС.Спать(мс)
КОН Пауза; 

(******************************************************************************)
ЗАДАЧА Переход(номерЧасов:ЦЕЛ); 
УКАЗ
  ЕСЛИ играем И (задержка <= 0) ТО
    (* каждый проход - смена картинки *)
    ЕСЛИ Игра.состояние = Игра.сУпор ТО
      играем:=ОТКЛ; 
      Игра.КонецИгры(Пауза); 
      НачатьЗаново
    КОН; 
    ЕСЛИ Игра.состояние = Игра.сНовый ТО
      Показания; 
      ЕСЛИ Игра.слоёв >= будетСлоёв ТО
        будетСлоёв:=Игра.слоёв+слоёвНаУровень; 
        СледУровень
      КОН; 
      Игра.НовыйКирпич(Случ(Игра.Кирпичей-1),(9+Случ(6))*16)
    КОН; 
    задержка:=уровней-уровень+1; 
    Игра.Переход
  КОН; 
  УМЕНЬШИТЬ(задержка)
КОН Переход; 

(******************************************************************************)
ЗАДАЧА Поехали; 
ПЕР
  поле:Поле.Доступ;  (* рабочее поле экрана *)
  часы:ЦЕЛ; 
УКАЗ
  Окно.Графическое("Тетрис","Lucida Console",24,Переход); 
(*
  Окно.Текстовое(Переход); 
 *)
  поле:=СоздатьПоле(); 
  Поле.ОкноНаВсёПоле(поле); 
  Поле.Рисовать(поле); 
  часы:=Окно.СоздатьЧасы(1,50);  (* самый быстрый переход за 50 мс *)
  Окно.Показать; 
  ПОКА поле.состояние = Поле.сРабота ВЫП
    (* проверяем и обрабатываем ввод от человека *)
    Поле.Проверить(поле)
  КОН; 
  Окно.УдалитьЧасы(часы)
КОН Поехали; 

(******************************************************************************)
УКАЗ
  Игра.Подготовить(рисоватьКлетку); 
  НачатьЗаново; 
  Поехали
КОН Тетрис.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы